package com.linkit.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;

import android.util.Log;

import com.linkit.config.PageLinks;
import com.linkit.config.Setting;
import com.linkit.exception.ErrorCodes;
import com.linkit.exception.FTExceptions;
import com.linkit.main.MainActivity;
import com.linkit.main.article.ArticlesLayout;
import com.linkit.model.Advertise;
import com.linkit.model.Article;
import com.linkit.model.Category;
import com.linkit.model.HttpParams;
import com.linkit.model.ServiceTaskResult;
import com.linkit.model.Site;
import com.linkit.utils.Constants;
import com.linkit.utils.ServiceUtils;
import com.linkit.utils.Utils;

/**
 * Xử lý Lấy thông tin thiết lập site, danh mục và bài viết đầu tiên của trang
 * 
 * @author ndluc
 * 
 */
public class ConfigsHandler extends Thread{
	public static final String SITE_ID = "site";
	public static final String CATS_ID = "cats";
	public static final String TYPE = "types";
	public static final String LAST_DATE = "lastDate";
	// Tham số đầu vào
	private MainActivity main;
	private HttpParams configParameters;
	private HashMap<String, Object> referenceParams;

	public ConfigsHandler() {
		main = MainActivity.getInstance();
	}

	/**
	 * Lấy thông tin thiết lập site, danh mục và bài viết đầu tiên của trang
	 */
	public void doRequest(String siteId, String cats, String type, Long date) {

		configParameters = new HttpParams();

		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		if (siteId != null && !Setting.SETTING_ALL_ID.equals(siteId)) {
			nameValuePairs.add(new BasicNameValuePair(SITE_ID, siteId));
		}

		if (cats != null && !Setting.SETTING_ALL_ID.equals(cats)) {
			nameValuePairs.add(new BasicNameValuePair(CATS_ID, cats));
		}

		if (type != null && !Setting.SETTING_ALL_ID.equals(type)) {
			nameValuePairs.add(new BasicNameValuePair(TYPE, String
					.valueOf(type)));
		}

		if (date != null) {
			nameValuePairs.add(new BasicNameValuePair(LAST_DATE, String
					.valueOf(date)));
		}
		
		if (!nameValuePairs.isEmpty()) {
			configParameters.setParameters(nameValuePairs);
		}
		configParameters.setUrl(Constants.WEBSERVICE_URL);
		configParameters.setMethodName(PageLinks.CONFIGS_LIST
				.getName());
		// lấy dữ liệu từ server
		start();
	}

	/**
	 * Lấy dữ liệu từ server
	 */
	@Override
	public void run() {
		// Lưu trữ dữ liệu tải về từ Web
		ServiceTaskResult<String> result = new ServiceTaskResult<String>();
		String data = "";
		for (int i = 0; i < Constants.RETRY_CONNECTING_NUMBER; i++) {
			try {
				data = ServiceUtils.getServiceByGet(configParameters);
				result.setResult(data);
				break;
			} catch (Exception e) {
				
				if (e instanceof FTExceptions) {
					result.setException(e);
					continue;
				} else {
					result.setException(new FTExceptions(ErrorCodes.UNKNOWN_HOST));
					break;
				}
			}
		}
		updateResult(result, referenceParams);
	}

	@SuppressWarnings("rawtypes")
	private synchronized void updateResult(ServiceTaskResult result,
			HashMap<String, Object> referentNumber) {
		Log.e("","",result.getException());
		if (result.hasException()) {
			doExceptions(
					(FTExceptions) result.getException());
		} else {
			
			try {
				String resultStr = (String) result.getResult();
				updateConfigs(resultStr);
			} catch (Exception e) {
				Log.e(Constants.TAG,
						"PARSED_JSON_EXCEPTION: Lỗi khi lấy danh sách các tin mới nhất",
						e);
				//có lỗi khi parse dữ liệu trả về
				doExceptions(new FTExceptions(
						ErrorCodes.PARSED_JSON_EXCEPTION));
			}
		}
	}

	/**
	 * Lấy site config
	 * @param data
	 * @return
	 * @throws Exception
	 */
	private void updateConfigs(String data)
			throws Exception {
		
		JSONObject jsonObject = new JSONObject(data);
		JSONObject c;
		
		//Lấy các site config
		JSONArray jsonArraySite = jsonObject.getJSONArray("s");
		main.sitesList = new ArrayList<Site>();
		Site site = null;
		
		int length = jsonArraySite.length();
		for (int i = 0; i < length; i++) {
			site = new Site();
			c = jsonArraySite.getJSONObject(i);
			site.id = c.getInt("i");
			site.domain = c.getString("d");
			site.logo = c.getString("l");
			main.sitesList.add(site);
		}
		
		//lấy danh sách loại 
		JSONArray jsonArrayCat = jsonObject.getJSONArray("c");
		main.categoriesList = new ArrayList<Category>();
		Category cat = null;
		
		for (int i = 0; i < jsonArrayCat.length(); i++) {
			cat = new Category();
			c = jsonArrayCat.getJSONObject(i);
			cat.id = c.getInt("i");
			cat.name = c.getString("c");
			main.categoriesList.add(cat);
		}
		
		Advertise advertise = new Advertise();
		advertise.iconLink = "http://static.linkit.vn/images/split.png";
		advertise.iconLink = "Kiến thức IT trong tầm tay bạn";
		advertise.link = "http://linkit.vn/";
		main.setAdvertise(advertise);
		
		//lấy danh sách các bài viết đầu tiên
		JSONArray jsonArrayArticle = jsonObject.getJSONArray("a");
		ArrayList<Article> article = Utils.getNewsList(jsonArrayArticle);
		
		if(article != null && article.size() > 0){
			doResponse(article);
		}else{
			//có lỗi khi parse dữ liệu trả về
			doExceptions(new FTExceptions(
					ErrorCodes.NO_RESULT_ERROR));
		}
		
	}
	
	/**
	 * Thực hiện truyền và hiện thị dữ liệu cho thông tin chi tiết của hãng 
	 * @param object
	 */
	public void doResponse(final ArrayList<Article> list) {
		
		main.runOnUiThread(new Runnable() {
			
			@Override
			public void run() {
				main.startLayout.hidden();
				ArticlesLayout layout = new ArticlesLayout();
				layout.showPage(list);
			}
		});
	}
	
	/**
	 * Xử lý các lỗi xảy ra khi lấy dữ liệu từ server
	 * @param e
	 */
	public void doExceptions(final FTExceptions e) {
		main.runOnUiThread(new Runnable() {
			
			@Override
			public void run() {
				main.startLayout.showAlert("Không lấy được dữ liệu từ server");
			}
		});
	}
}
